package com.hxzon.util;

import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.List;

import ognl.Ognl;
import ognl.OgnlException;

import org.apache.commons.lang.StringEscapeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class OgnlUtil {
	protected static final Logger logger = LoggerFactory
			.getLogger(OgnlUtil.class);

	public static Object getValue(Object o, String ex) {
		Object expression = null;
		try {
			expression = Ognl.parseExpression(ex);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
		}
		Object result = null;
		try {
			result = Ognl.getValue(expression, o);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
		}
		return result;
	}

	public static String getStringValueOrEmpty(Object o, String ex) {
		Object expression = null;
		try {
			expression = Ognl.parseExpression(ex);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
		}
		Object result = null;
		try {
			result = Ognl.getValue(expression, o);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
		}
		if (result == null) {
			return "";
		}
		if (result instanceof String) {
			return ((String) result).trim();
		}
		return result.toString();
	}
	
	public static String getStringValueEscape(Object o,String ex){
		return escape(getStringValueOrEmpty( o,  ex));
	}
	
	public static String escape(String orig) {
//		orig = StringEscapeUtils.escapeHtml(orig);
//		orig = StringEscapeUtils.escapeJavaScript(orig);
		orig = StringEscapeUtils.escapeSql(orig);
		return orig;
	}

	public static boolean setValue(Object o, String ex, Object value) {
		Object expression = null;
		try {
			expression = Ognl.parseExpression(ex);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
			return false;
		}

		try {
			Ognl.setValue(expression, o, value);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
			return false;
		}
		return true;
	}

	public static boolean setStringValueOrEmpty(Object o, String ex,
			String value) {
		Object expression = null;
		try {
			expression = Ognl.parseExpression(ex);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
			return false;
		}
		if (value == null) {
			value = "";
		}

		try {
			Ognl.setValue(expression, o, value);
		} catch (OgnlException e) {
			logger.error(e.getMessage(), e);
			return false;
		}
		return true;
	}

	public static Class getClass(Object o, String ex) {
		Object value = getValue(o, ex);
		return value == null ? null : value.getClass();
	}

	// public static Object[][] get(List list,List<String> ex){
	// int row=list.size();
	// int col=ex.size();
	// Object[][] objs=new Object[row][col];
	// for(int i=0;i<row;i++){
	// for(int j=0;j<col;j++){
	// objs[i][j]=OgnlUtils.getValue(list.get(i), ex.get(i));
	// }
	// }
	// return objs;
	// }
	//    
	// public static Vector convertToVector(List list,List<String> ex){
	// int row=list.size();
	// int col=ex.size();
	// Vector v=new Vector(row);
	// for(int i=0;i<row;i++){
	// Vector vi=new Vector(col);
	// for(int j=0;j<col;j++){
	// vi.add(OgnlUtils.getValue(list.get(i), ex.get(i)));
	// }
	// v.add(vi);
	// }
	// return v;
	// }
	public static PropertyUtilsBean propertyUtils = new PropertyUtilsBean();

	public static List<String> getAllProperty(Class clazz) {
		PropertyDescriptor[] descriptors = propertyUtils
				.getPropertyDescriptors(clazz);
		List<String> propertyName = new ArrayList<String>();
		for (int i = 0; i < descriptors.length; i++) {
			String name = descriptors[i].getName();
			if (MethodUtils.getAccessibleMethod(clazz, descriptors[i]
					.getReadMethod()) != null) {
				propertyName.add(name);
			}
		}
		return propertyName;
	}

	public static List<String> getAllStringProperty(Class clazz) {
		PropertyDescriptor[] descriptors = propertyUtils
				.getPropertyDescriptors(clazz);
		List<String> propertyName = new ArrayList<String>();
		for (int i = 0; i < descriptors.length; i++) {
			String name = descriptors[i].getName();
			if (MethodUtils.getAccessibleMethod(clazz, descriptors[i]
					.getReadMethod()) != null && descriptors[i].getPropertyType().equals(String.class)
					) {
				propertyName.add(name);
			}
		}
		propertyName.remove("id");
		return propertyName;
	}
	
	public static void escapeStringProperty(Object o){
		List<String> properties=getAllStringProperty(o.getClass());
		String value;
		for(String property:properties){
			value=escape(getStringValueOrEmpty(o,property));
			setValue(o,property,value);
		}
	}

}
